home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / DUMBTERM.PAS < prev    next >
Pascal/Delphi Source File  |  1997-03-02  |  28KB  |  883 lines

  1. UNIT DumbTerm;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Termial program                               Last changed: 02.03.97  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-97 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32;
  16.  
  17. PROCEDURE TerminalMode;
  18.  
  19. IMPLEMENTATION
  20.  
  21. USES Dos, OpCrt, OpWindow, OpDos, OpString, OpEdit, OpMenu, OpEntry, OpCmd,
  22.      OpFrame, OpField, OpDate, OpKey, OpSelect, OpPick, OpRoot, ApTimer,
  23. {$IFDEF OS2}
  24.      VpUtils,
  25. {$ENDIF}
  26.      Globals, PoPTypes, NodeList, Com, Modem, Musica, PingAnsi, TpAvatar,
  27.      OproUtil, Protocol, ZSend, ZReceive, StrUtil, FileUtil, Input, TransVid,
  28.      Keyboard, Display, InterCom, Resource, NetFile, Util, MailUtil, MTask,
  29.      Usage;
  30.  
  31. TYPE
  32.   DialDirListe = Object(Picklist)
  33.     f : PNetFile;
  34.  
  35.     constructor Init(VAR AFile: TNetFile);
  36.     Procedure ItemString(Item: Word; Mode: PkMode; Var IType: PkItemType; var IString: string); Virtual;
  37.   END;
  38.  
  39.   Constructor DialDirListe.Init(VAR AFile: TNetFile);
  40.   Begin
  41.     f:=@AFile;
  42.     if not INHERITED InitAbstract(34, 5, 65, 18, Cfg.Color[3],
  43.                                   DefWindowOptions or Wbordered,
  44.                                   32, f^.FileSize, PickVertical,
  45.                                   SingleChoice) then
  46.       Fail;
  47.     if Cfg.Screen.ExplodingWin then EnableExplosions(10);
  48.     SetSearchMode(PickStringSearch);
  49.     SetPadSize(1,1);
  50.     Wframe.AddHeader(' Dial List ',heTC);
  51.     AddMoreHeader(' More   ',HeBR,#24,#25,'',7,8,0);
  52.   end;
  53.  
  54.   procedure Dialdirliste.ItemString(Item : Word; Mode : PkMode; Var IType : PkItemType; Var IString : String);
  55.   var
  56.     DialDir: TDialDir;
  57.   BEGIN
  58.     Istring:='';
  59.     if f^.filesize < Item-1 then Exit;
  60.     f^.GetRec(DialDir,Item-1,NoKeep,Wait);
  61.     IF f^.IoResult=0 THEN IString:=DialDir.Name;
  62.   END;
  63.  
  64.   PROCEDURE DialDirUpd(ASP: AbstractSelectorPtr); far;
  65.   BEGIN
  66.     WITH cfg.color[2] DO
  67.     BEGIN
  68.       FastWrite(LongIntForm('####',PNetFile(ASP^.wUserData)^.FilePos), 2, 17, HighLightColor);
  69.     END;
  70.   END;
  71.  
  72.   PROCEDURE TerminalMode;
  73.   VAR
  74.     m           : TPoPMenu;
  75.     DetectStr   : S20;
  76.     InitCmd,
  77.     FileName    : PathStr;
  78.     LogFile     : TBufTextFile;
  79.     LocalEcho,
  80.     LogMode     : Boolean;
  81.     StatusWin,
  82.     TerminalWin : windowptr;
  83.     DialDir     : TDialDir;
  84.     WasOnline   : BOOLEAN;
  85.     GemAttr,
  86.     TermMode,
  87.     SendFileNum : Byte;
  88.     SavePtr     : Pointer;
  89.     SendFileTab : ARRAY[1..50] OF PathStr;
  90.     InKey       : Word;
  91.     InActivity  : EventTimer;
  92.  
  93.     FUNCTION TermModeStr(CONST i:BYTE):S8;
  94.     BEGIN
  95.       CASE i OF
  96.         0 : TermModeStr:='AUTOMODE';
  97.         1 : TermModeStr:='ANSI-BBS';
  98.         2 : TermModeStr:='AVATAR  ';
  99.        ELSE TermModeStr:='        ';
  100.       END;
  101.     END;
  102.  
  103.     PROCEDURE DisplayStatusLine;
  104.     VAR
  105.       s : s80 ;
  106.     BEGIN
  107.       s:='Alt-Z for help│'+charstr(' ',26)+'│';
  108.       IF LocalEcho THEN s:=s+'ECHO' ELSE s:=s+'    ';
  109.       s:=s+'│'+TermModeStr(termmode)+'│'+LongIntForm('#####',ComPort^.GetBaudRate)+'-'+ComPort^.GetLinkData;
  110.       IF LogMode THEN s:=s+'│Log' ELSE s:=s+'│   ';
  111.       IF ComPort^.Carrier THEN s:=s+'│On-Line ' ELSE s:=s+'│Off-Line';
  112.       StatusWin^.ActivateWrite;
  113.       StatusWin^.wFastWrite(s,1,1,cfg.color[2].BlockColor);
  114.       StatusWin^.DeActivateWrite;
  115.       TextAttr:=GemAttr;
  116.     END;
  117.  
  118.     PROCEDURE ToggleLogging;
  119.     VAR
  120.       FileName : S67;
  121.     BEGIN
  122.       IF LogMode THEN
  123.       BEGIN
  124.         LogFile.Done;
  125.         LogMode:=False;
  126.       END ELSE
  127.       BEGIN
  128.         FileName:=MakeTaskFileName(PoPDumbTermLogFileName);
  129.         IF InputString(20,8,67,20,2,'Session logging','FileName: ',FileName) THEN
  130.         BEGIN
  131.           LogMode:=LogFile.InitCreate(FileName, SOpenWrite, Max64k(MaxAvail-10240));
  132.         END;
  133.       END;
  134.       DisplayStatusLine;
  135.     END;
  136.  
  137.     PROCEDURE InitTerminal;
  138.     BEGIN
  139.       StopClock;
  140.       ComPort^.SetFlowControl(2);
  141.       termmode:=0;
  142.       LocalEcho:=False;
  143.       WasOnline:=FALSE;
  144.       LogMode:=False;
  145.       DetectStr:=CharStr(' ',20);
  146.       MyWin(StatusWin,1,ScreenHeight,ScreenWidth,ScreenHeight,0,'',False);
  147.       MyWin(TerminalWin,1,1,ScreenWidth,ScreenHeight-1,0,'',False);
  148.       DisplayStatusLine;
  149.       IF Cfg.DumbTerm.ModemInit<>'' THEN
  150.       BEGIN
  151.         InitCmd:=Cfg.DumbTerm.ModemInit;
  152.         InitModem(Cfg.Modem.BaudRate, Cfg.Modem.PreInit, InitCmd);
  153.       END ELSE
  154.         InitCmd:=Cfg.Modem.Init;
  155.       normalcursor;
  156.       TextAttr:=7;
  157.       GemAttr:=7;
  158.       ClrScr;
  159.       HelpKey:=AltZ;
  160.       Topic:=60;
  161.       GlobNodeStat:=nsPassword;
  162.       NewTimerSecs(InActivity, 300);
  163.     END;
  164.  
  165.     PROCEDURE DialNumber;
  166.     VAR
  167.       dial         : windowptr;
  168.       ErrorStatus  : Boolean;
  169.       Name         : S80;
  170.       s            : S40;
  171.       Number       : S20;
  172.       Sec          : LongInt;
  173.       DialAddress  : TFidoAddress;
  174.       RealBaudRate : Word;
  175.       t            : EventTimer;
  176.       f            : TNetFile;
  177.  
  178.       PROCEDURE DialDirectory;
  179.       LABEL Slut;
  180.       VAR
  181.         key         : WORD;
  182.         esr         : TPoPEntryScreen;
  183.  
  184.         FUNCTION FindDialEntry(CONST Num: S20) : S20;
  185.         VAR
  186.           n,test : Integer;
  187.           f : TNetFile;
  188.         BEGIN
  189.           ErrorStatus:=TRUE;
  190.           IF f.Open(PoPDumbTermDialDirName, SizeOf(TDialDir), False) THEN
  191.           BEGIN
  192.             Val(Copy(num,1,4),n,test);
  193.             IF test<>0 THEN Exit;
  194.             f.GetRec(DialDir,n-1,NoKeep,Wait);
  195.             IF f.IoResult<>0 THEN
  196.             BEGIN
  197.               f.Close;
  198.               Exit;
  199.             END;
  200.             f.Close;
  201.             ErrorStatus:=FALSE;
  202.             FindDialEntry:=DialDir.Phone;
  203.           END;
  204.         END;
  205.  
  206.         PROCEDURE InitMenu(VAR m : TPoPMenu);
  207.         BEGIN
  208.           GetMenu(MnuDTDialDir,3,M);
  209.           WITH M DO
  210.           BEGIN
  211.             MenuCommands.AddCommand(ccUser1,1,Word(256 * 73),0);
  212.             MenuCommands.AddCommand(ccUser2,1,Word(256 * 81),0);
  213.           END;
  214.         END;
  215.  
  216.         PROCEDURE AddDialDirEntry;
  217.         VAR
  218.           i : LongInt;
  219.         BEGIN
  220.           i:=f.FilePos-1;
  221.           FillChar(DialDir,SizeOf(DialDir),#0);
  222.           f.PutRec(DialDir,f.FileSize);
  223.           f.GetRec(DialDir,i,NoKeep,Wait);
  224.         END;
  225.  
  226.         PROCEDURE FindDirEntry;
  227.         VAR
  228.           Search      : S40;
  229.           Found,
  230.           SearchMore  : Boolean;
  231.           old         : INTEGER;
  232.         BEGIN
  233.           Search:='';
  234.           IF InputString(20,8,40,21,3,'Find entry','Search string : ',Search) AND (Search<>'') THEN
  235.           BEGIN
  236.             Search:=StUpCase(Search);
  237.             old:=f.FilePos-1;
  238.             f.SEEK(0);
  239.             FILLCHAR(DialDir,SizeOf(DialDir),0);
  240.             SearchMore:=TRUE;
  241.             Found:=FALSE;
  242.             WHILE NOT f.EOF AND SearchMore DO
  243.             BEGIN
  244.               f.Read(DialDir,NoKeep,Wait);
  245.               IF POS(search,StUpCase(DialDir.Name))<>0 THEN
  246.               BEGIN
  247.                 Found:=TRUE;
  248.                 Esr.Select;
  249.                 Esr.ResetScreen;
  250.                 Esr.Draw;
  251.                 SearchMore:=Confirm('Search for more','N',8);
  252.               END;
  253.             END;
  254.             IF NOT Found THEN
  255.             BEGIN
  256.               f.GetRec(DialDir,Old,NoKeep,Wait);
  257.               Esr.ResetScreen;
  258.             END;
  259.           END;
  260.         END;
  261.  
  262.         PROCEDURE RemoveDialDirEntry;
  263.         VAR
  264.           oldnum,i : LongInt;
  265.         BEGIN
  266.           IF Confirm('Remove current entry','N',8) THEN
  267.           BEGIN
  268.             oldnum:=f.FilePos-1;
  269.             IF oldnum=f.FileSize-1 THEN Dec(oldnum);
  270.             FOR i:=f.FilePos-1 TO f.FileSize-2 DO
  271.             BEGIN
  272.               f.GetRec(DialDir,i+1,NoKeep,Wait);
  273.               f.PutRec(DialDir,i);
  274.             END;
  275.             f.Seek(f.FileSize-1); f.Truncate;
  276.             f.GetRec(DialDir,oldnum,NoKeep,Wait);
  277.             Esr.ResetScreen;
  278.           END;
  279.         END;
  280.  
  281.         PROCEDURE DialDirList;
  282.         var
  283.           Diallist : DialDirListe;
  284.         BEGIN
  285.           if DialList.Init(f) then
  286.           begin
  287.             DialList.Process;
  288.             DialList.Erase;
  289.             if DialList.GetLastCommand<>ccquit then f.Seek(DialList.GetLastChoice-1);
  290.             DialList.Done;
  291.           end;
  292.         END;
  293.  
  294.         PROCEDURE SortDialDir;
  295.         VAR
  296.           o,i:LONGINT;
  297.           a,b:TDialDir;
  298.           Flag:BOOLEAN;
  299.         BEGIN
  300.           o:=f.FILEPOS-1;
  301.           REPEAT
  302.             Flag:=FALSE;
  303.             FOR i:=0 TO f.FileSize-2 DO
  304.             BEGIN
  305.               f.GetRec(a,i,NoKeep,Wait); f.Read(b,NoKeep,Wait);
  306.               IF StUpCase(a.name)>StUpCase(b.name) THEN
  307.               BEGIN
  308.                 Flag:=TRUE;
  309.                 f.PutRec(b,i); f.Write(a);
  310.               END;
  311.             END;
  312.           UNTIL NOT Flag;
  313.           f.GetRec(DialDir,o,NoKeep,Wait);
  314.           Esr.ResetScreen;
  315.         END;
  316.  
  317.       BEGIN
  318.         IF Number<>'' THEN Number:=FindDialEntry(Number) ELSE
  319.         BEGIN
  320.           ErrorStatus:=True;
  321.           f.Open(StartPath+PoPDumbTermDialDirName, SizeOf(TDialDir), True);
  322.           IF f.FileSize=0 THEN
  323.           BEGIN
  324.             IF Confirm('No entries found. Create one','Y',8) THEN
  325.             BEGIN
  326.               FillChar(DialDir,SizeOf(DialDir),#0);
  327.               f.Write(DialDir);
  328.               f.Seek(0);
  329.             END ELSE
  330.               GOTO Slut;
  331.           END;
  332.           WITH esr DO
  333.           BEGIN
  334.             Esr.Init(3,3,78,20,2,'Dialing Directory');
  335.             AddTextField(  'Entry number  : ',2,2);
  336.             addstringfield('Name          : ',4,2,charstr('X',30),4,20,30,0,DialDir.Name);
  337.             addstringfield('Phone number  : ',6,2,charstr('X',20),6,20,20,0,DialDir.Phone);
  338.             addbytefield(  'Terminal type : ',8,2,'#',8,20,0,0,2,DialDir.termmode);
  339.             esr.wUserData:=LongInt(@f);
  340.             ESR.SetScreenUpdateProc(DialDirUpd);
  341.             Esr.Draw;
  342.             InitMenu(m);
  343.             f.Read(DialDir,NoKeep,Wait);
  344.             REPEAT
  345.               Esr.ResetScreen;
  346.               Esr.Select;
  347.               Esr.Draw;
  348.               m.Select;
  349.               m.Process;
  350.               key:=m.MenuChoice;
  351.               IF m.GetLastCommand IN [ccUser1,ccUser2] THEN
  352.               BEGIN
  353.                 CASE m.GetLastCommand OF
  354.                   ccUser1 : IF f.FilePos>1 THEN f.Seek(f.FilePos-2) ELSE f.Seek(f.filesize-1);
  355.                   ccUser2 : IF f.FilePos=f.FileSize THEN f.Seek(0);
  356.                 END;
  357.                 f.Read(DialDir,NoKeep,Wait);
  358.               END ELSE
  359.               BEGIN
  360.                 IF m.GetLastCommand<>ccQuit THEN
  361.                 BEGIN
  362.                   CASE key OF
  363.                     1 : IF DialDir.Phone<>'' THEN
  364.                         BEGIN
  365.                           ErrorStatus:=False;
  366.                           Number:=DialDir.Phone;
  367.                           Name:=DialDir.Name;
  368.                         END;
  369.                     2 : BEGIN
  370.                           select;
  371.                           SetNextField(0);
  372.                           process;
  373.                           f.PutRec(DialDir,f.FilePos-1);
  374.                         END;
  375.                     3 : FindDirEntry;
  376.                     4 : BEGIN
  377.                           AddDialDirEntry;
  378.                           f.GetRec(DialDir, f.FileSize-1, NoKeep, Wait);
  379.                         END;
  380.                     5 : BEGIN
  381.                           RemoveDialDirEntry;
  382.                           f.GetRec(DialDir, 0, NoKeep, Wait);
  383.                         END;
  384.                     7 : BEGIN
  385.                           SortDialDir;
  386.                           f.GetRec(DialDir, 0, NoKeep, Wait);
  387.                         END;
  388.                     8 : BEGIN
  389.                           DialDirList;
  390.                           f.Read(DialDir,NoKeep,Wait);
  391.                         END;
  392.                   END;
  393.                 END;
  394.               END;
  395.             UNTIL (m.GetLastCommand=ccQuit) OR NOT ErrorStatus;
  396.             Esr.Done;
  397.             m.Done;
  398.           END;
  399. Slut:
  400.           Topic:=60;
  401.           f.Close;
  402.         END;
  403.       END;
  404.  
  405.     BEGIN
  406.       Number:='';
  407.       IF InputString(20,8,20,20,3,'Dial','Number : ',Number) THEN
  408.       BEGIN
  409.         ErrorStatus:=False;
  410.         IF (POS('/',Number)>0) AND GetAdressFromStr(Number,DialAddress) THEN
  411.         BEGIN
  412.           ErrorStatus:=NOT FindNode(DialAddress,nodelistentry);
  413.           IF NOT ErrorStatus THEN
  414.           BEGIN
  415.             Number:=Nodelistentry.PhoneNumber;
  416.             Name:=nodelistentry.SystemName;
  417.           END;
  418.         END ELSE
  419.         BEGIN
  420.           IF (Number<>'') AND (Upcase(Number[1])='M') THEN
  421.           BEGIN
  422.             Delete(Number,1,1);
  423.             Name:='Manually entered number';
  424.           END ELSE
  425.           BEGIN
  426.             DialDirectory;
  427.             IF NOT ErrorStatus THEN
  428.             BEGIN
  429.               termmode:=DialDir.termmode;
  430.               Name:=DialDir.Name;
  431.             END;
  432.           END;
  433.         END;
  434.         IF NOT ErrorStatus THEN
  435.         BEGIN
  436.           mywin(dial,20,9,60,13,2,'Dialing',True);
  437.           WITH cfg.color[2],dial^ DO
  438.           BEGIN
  439.             wfasttext(' Name    : ',1,1);
  440.             wfasttext(' Calling : ',2,1);
  441.             wfasttext(' TimeOut : ',3,1);
  442.             wfastwrite(Name,1,12,HighLightColor);
  443.             wfastwrite(Number,2,12,HighLightColor);
  444.           END;
  445.           TranslateModemString(cfg.modem.dial+Number+'|');
  446.           Sec:=cfg.modem.waittime;
  447.           s:='';
  448.           REPEAT
  449.             NewTimerSecs(t, 1);
  450.             dial^.wfastwrite(Long2Str(Sec)+' ',3,12,cfg.color[2].HighLightColor);
  451.             REPEAT
  452.               GiveUpTime ;
  453.             UNTIL ComPort^.KeyPressed OR KeyPressed OR TimerExpired(t);
  454.             Dec(Sec);
  455.             IF ComPort^.KeyPressed THEN s:=ModemReadStr;
  456.           UNTIL (Sec=0) OR KeyPressed OR
  457.                 (s='BUSY') OR (Copy(s,1,2)='NO') OR (Copy(s,1,7)='CONNECT');
  458.           KillWindow(Dial);
  459.           WaitForSlowModem;
  460.           IF COPY(s,1,7)='CONNECT' THEN
  461.           BEGIN
  462.             RealBaudRate:=GetRealBaudRate(s);
  463.             UpdateConnectStat(CSUser, CSOut, RealBaudRate, s);
  464.             IF IsLockedBaud(s) THEN
  465.             BEGIN
  466.               ComPort^.SetBaudRate(Cfg.Modem.BaudRate);
  467.               ComPort^.SetCurrentBaud(RealBaudRate);
  468.             END ELSE
  469.             BEGIN
  470.               ComPort^.SetBaudRate(RealBaudRate);
  471.             END;
  472.             WasOnline:=TRUE;
  473.           END;
  474.           DisplayStatusLine;
  475.           TextAttr:=GemAttr;
  476.           WRITELN(#13#10,s);
  477.         END;
  478.       END;
  479.     END;
  480.  
  481.     PROCEDURE SetUpTransferMenu(CONST Upload : Boolean);
  482.     VAR
  483.       s   : S8;
  484.       i,j : BYTE;
  485.     BEGIN
  486.       IF Upload THEN s:='Upload' ELSE s:='Download';
  487.       j:=6;
  488.       FOR i:=1 TO 5 DO
  489.        WITH Cfg.ExtProt[i] DO
  490.         IF key>=#33 THEN INC(j);
  491.       m.Init(22,6,39,5+j,3,s);
  492.       WITH m DO
  493.       BEGIN
  494.         AddItem('Xmodem',1,1,1);
  495.         AddItem('Ymodem (X-1K)',2,1,2);
  496.         AddItem('Zmodem',3,1,3);
  497.         AddItem('SEALink',4,1,4);
  498.         AddItem('TeLink',5,1,5);
  499.         AddItem('Modem 7',6,1,6);
  500.         j:=6;
  501.  
  502.         FOR i:=1 TO 5 DO
  503.           WITH Cfg.ExtProt[i] DO
  504.             IF key>=#33 THEN
  505.             BEGIN
  506.               INC(j);
  507.               IF Pos(Key,Name)<>0 THEN AddItem(Name,j,Pos(Key,Name),i+6)
  508.                                   ELSE AddItem(Key+' '+Name,j,1,i+6);
  509.           END;
  510.         ItemsDone;
  511.         Draw;
  512.       END;
  513.     END;
  514.  
  515.     FUNCTION MakeReplaces(s: STRING): STRING;
  516.     VAR
  517.       i: BYTE;
  518.       f: TBufTextFile;
  519.     BEGIN
  520.       Replace(s,'$port',Long2Str(cfg.Modem.commport),0);
  521.       Replace(s,'$baud',Long2Str(ComPort^.GetBaudRate),0);
  522.       Replace(s,'$filename',filename,0);
  523.       Replace(s,'$inbound',Cfg.Inbound[GlobNodeStat],0);
  524.       IF POS('$filelistname',s)<>0 THEN
  525.       BEGIN
  526.         f.Init('$FILELST.POP', SCreate, 1024);
  527.         FOR i:=1 TO SendFileNum DO
  528.           f.Writeln(SendFileTab[i]);
  529.         f.Done;
  530.         Replace(s,'$filelistname','$FILELST.POP',0);
  531.       END;
  532.       MakeReplaces:=s;
  533.     END;
  534.  
  535.     PROCEDURE SendFiles;
  536.     VAR
  537.       key     : WORD;
  538.       s       : STRING;
  539.       OldX, OldY,
  540.       i       : BYTE;
  541.  
  542.       FUNCTION GetFileNames(CONST maxnum: BYTE): BOOLEAN;
  543.       VAR
  544.         Temp:WindowPtr;
  545.         escaped:BOOLEAN;
  546.       BEGIN
  547.         MyWin(Temp,2,2,79,8,3,'Files to send',False);
  548.         SendFileNum:=0;
  549.         FillChar(SendFileTab,SizeOf(SendFileTab),0);
  550.         REPEAT
  551.           INC(SendFileNum);
  552.           Escaped:=NOT InputString(10,10,44,44,2,'Send file','FileName : ',SendFileTab[SendFileNum]);
  553.           IF NOT Escaped AND (SendFileTab[SendFileNum]<>'') THEN
  554.           BEGIN
  555.             Temp^.ScrollVert(1);
  556.             WITH Cfg.Color[3] DO
  557.               Temp^.wFastText(CPad(SendFileTab[SendFileNum],76),5,1);
  558.           END;
  559.         UNTIL (SendFileTab[SendFileNum]='') OR Escaped OR (SendFileNum=MaxNum);
  560.         KillWindow(Temp);
  561.         GetFileNames:=NOT Escaped;
  562.       END;
  563.  
  564.     BEGIN
  565.       SetUpTransferMenu(True);
  566.       m.Process;
  567.       key:=m.MenuChoice;
  568.       m.Erase;
  569.       IF (m.GetLastCommand<>ccQuit) THEN
  570.       BEGIN
  571.         CASE key OF
  572.           1..2,
  573.           5..6  : SendFileNum:=1;
  574.           3..4  : SendFileNum:=50;
  575.           7..11 : SendFileNum:=10;
  576.         END;
  577.         IF GetFileNames(SendFileNum) THEN
  578.         BEGIN
  579.           IF Key IN [1..6] THEN
  580.             SetupTransferWindows(false)
  581.           ELSE
  582.             SaveWindow(1,1,ScreenWidth,ScreenHeight,True,SavePtr);
  583.           OldX:=WhereX; OldY:=WhereY;
  584.           CASE key OF
  585.             1 : SendFile(SendFileTab[1],'',XModem);
  586.             2 : SendFile(SendFileTab[1],'',YModem);
  587.             3 : BEGIN
  588.                   FOR i:=1 TO SendFileNum DO
  589.                     ZModemSend(SendFileTab[i],'',i,0);
  590.                   ZModemSend('','',-2,0);
  591.                 END;
  592.             4 : BEGIN
  593.                   FOR i:=1 TO SendFileNum DO
  594.                     SendFile(SendFileTab[i],'',SeaLink);
  595.                   SendFile('','' ,SEALink);
  596.                 END;
  597.             5 : SendFile(SendFileTab[1],'',TeLink);
  598.             6 : SendFile(SendFileTab[1],'',Modem7);
  599.         7..11 : WITH Cfg.ExtProt[Key-6] DO
  600.                 BEGIN
  601.                   s:=MakeReplaces(SendCmd);
  602.                   ExecDos(s,True,NoExecDosProc);
  603.                   DeleteFile('$FILELST.POP');
  604.                 END;
  605.           END;
  606.           IF Key IN [1..6] THEN
  607.             RemoveTransferWindows
  608.           ELSE
  609.             RestoreWindow(1,1,ScreenWidth,ScreenHeight,True,SavePtr);
  610.           GotoXY(OldX, OldY);
  611.         END;
  612.       END;
  613.       m.Done;
  614.       Topic:=60;
  615.     END;
  616.  
  617.     PROCEDURE ReceiveFiles(CONST protocolnum: BYTE);
  618.     VAR
  619.       escaped : Boolean;
  620.       Ch      : Char;
  621.       key     : WORD;
  622.       s       : STRING;
  623.       OldX, OldY : Byte;
  624.     BEGIN
  625.       IF Protocolnum=0 THEN
  626.       BEGIN
  627.         SetUpTransferMenu(False);
  628.         m.Process;
  629.         key:=m.MenuChoice;
  630.         m.Erase;
  631.       END ELSE
  632.       BEGIN
  633.         Key:=protocolnum;
  634.         ch:=#0;
  635.       END;
  636.       FileName:=''; escaped:=False;
  637.       IF (m.GetLastCommand<>ccQuit) AND ((Key IN [1..2]) OR ((Key IN [7..11])) AND (Cfg.ExtProt[Key-6].AskDLName)) THEN
  638.       BEGIN
  639.         IF NOT (key IN [3..5]) THEN
  640.         BEGIN
  641.           Escaped:=NOT InputString(3,7,67,55,3,'Receive file','FileName : ',FileName);
  642.         END;
  643.       END;
  644.       IF (m.GetLastCommand<>ccQuit) AND NOT escaped THEN
  645.       BEGIN
  646.         IF Key IN [1..6] THEN
  647.           SetupTransferWindows(False)
  648.         ELSE
  649.           SaveWindow(1,1,ScreenWidth,ScreenHeight,True,SavePtr);
  650.         OldX:=WhereX; OldY:=WhereY;
  651.         CASE key OF
  652.           1 : ReceiveFile(cfg.inbound[GlobNodeStat],FileName,XModem);
  653.           2 : ReceiveFile(cfg.inbound[GlobNodeStat],FileName,YModem);
  654.           3 : ZModemReceive(Cfg.Inbound[GlobNodeStat],False);
  655.           4 : ReceiveFile(cfg.inbound[GlobNodeStat],FileName,SeaLink);
  656.           5 : ReceiveFile(cfg.inbound[GlobNodeStat],FileName,TeLink);
  657.           6 : ReceiveFile(cfg.inbound[GlobNodeStat],FileName,Modem7);
  658.       7..11 : WITH Cfg.ExtProt[Key-6] DO
  659.               BEGIN
  660.                 s:=MakeReplaces(RecvCmd);
  661.                 ExecDos(s,True,NoExecDosProc);
  662.                 DeleteFile('$FILELST.POP');
  663.               END;
  664.         END;
  665.         Pause(100);
  666.         IF Key IN [1..6] THEN
  667.           RemoveTransferWindows
  668.         ELSE
  669.           RestoreWindow(1,1,ScreenWidth,ScreenHeight,True,SavePtr);
  670.         GotoXY(OldX, OldY);
  671.       END;
  672.       Topic:=60;
  673.     END;
  674.  
  675.     PROCEDURE ScreenImage;
  676.     VAR
  677.       f   : TBufTextFile;
  678.       s   : String;
  679.       x,y : Word;
  680.     BEGIN
  681.       f.InitCreate(MakeTaskFileName(PoPDumbTermImageName), SOpenWrite, 2048);
  682.       FOR y:=0 TO ScreenHeight-1 DO
  683.       BEGIN
  684.         s:='';
  685.         FOR x:=0 TO ScreenWidth-1 DO
  686. {$IFNDEF OS2} {*****}
  687.           s:=s+Char(Mem[videosegment:y * (ScreenWidth*2)+x * 2]);
  688. {$ENDIF}
  689.         f.WriteLn(TrimTrail(s));
  690.       END;
  691.       f.Done;
  692.     END;
  693.  
  694.     PROCEDURE TerminalEmulation;
  695.     VAR
  696.       key : WORD;
  697.     BEGIN
  698.       GetMenu(MnuDTEmulation,3,m);
  699.       m.Process;
  700.       key:=m.MenuChoice;
  701.       IF m.GetLastCommand<>ccQuit THEN
  702.       BEGIN
  703.         termmode:=key-1;
  704.         DisplayStatusLine;
  705.       END;
  706.       m.Done;
  707.       Topic:=60;
  708.     END;
  709.  
  710.     PROCEDURE PortSetUp;
  711.     BEGIN
  712.       WITH ComPort^ DO
  713.         IF DataBits=3 THEN
  714.         BEGIN
  715.           DataBits:=2;
  716.           ParityBits:=24;
  717.           StopBits:=4;
  718.         END ELSE
  719.         BEGIN
  720.           DataBits:=3;
  721.           ParityBits:=0;
  722.           StopBits:=0;
  723.         END;
  724.     END;
  725.  
  726.     PROCEDURE HangUpModem;
  727.     VAR
  728.       Temp:WindowPtr;
  729.     BEGIN
  730.       Tell(Temp, 'Hanging up', 'Dumbterm', 6, 3);
  731.       ModemHangUp;
  732.       IF InitCmd<>'' THEN InitModem(cfg.Modem.BaudRate, cfg.modem.PreInit, InitCmd) ELSE ComPort^.SetDTR(On);
  733.       KillWindow(Temp);
  734.       WasOnline:=FALSE;
  735.       TextAttr:=GemAttr;
  736.       DisplayStatusLine;
  737.     END;
  738.  
  739.     PROCEDURE TerminalMain;
  740.     VAR
  741.       fc             : Char;
  742.       i,j            : Byte;
  743.  
  744.       PROCEDURE SendChar(CONST Ch: Byte);
  745.       BEGIN
  746.         ComPort^.WriteByte(Ch, True);
  747.         IF LocalEcho THEN Write(Char(Ch));
  748.       END;
  749.  
  750.     BEGIN
  751.       ClearAnsiState; ClearAvatarState;
  752.       DisplayStatusLine;
  753.       InKey:=0;
  754.       REPEAT
  755.         IF PopKeyPressed THEN
  756.         BEGIN
  757.           InKey:=PopReadKeyWord;
  758.           CASE Char(Lo(InKey)) OF
  759.       #1..#12,
  760.      #14..#255 : SendChar(Lo(InKey));
  761.            #13 : BEGIN
  762.                    SendChar(13);
  763.                    IF Cfg.DumbTerm.CRSendsLF THEN SendChar(10);
  764.                  END;
  765.             #0 : BEGIN
  766.                    CASE InKey OF
  767.                      AltC : BEGIN
  768.                               TextAttr:=7;
  769.                               CLRSCR;
  770.                             END;
  771.                      AltD : DialNumber;
  772.                      AltE : BEGIN
  773.                               LocalEcho:=NOT LocalEcho;
  774.                               DisplayStatusLine;
  775.                             END;
  776.                      AltH : HangUpModem;
  777.                      AltI : ScreenImage;
  778.                      AltL : ToggleLogging;
  779.                      AltP : PortSetUp;
  780.                      AltR : ReceiveFiles(0);
  781.                      AltS : SendFiles;
  782.                      AltT : TerminalEmulation;
  783.                   F1..F10 : ComPort^.WriteStr(#27'O'+CHAR((Hi(InKey)+21)));
  784.                        Up : ComPort^.WriteStr(#27'[A');
  785.                      Down : ComPort^.WriteStr(#27'[B');
  786.                      Right: ComPort^.WriteStr(#27'[C');
  787.                      Left : ComPort^.WriteStr(#27'[D');
  788.                    END;
  789.                  END;
  790.           END;
  791.           NewTimerSecs(InActivity, 300);
  792.         END ELSE
  793.           InKey:=0;
  794.         IF ComPort^.KeyPressed THEN
  795.         BEGIN
  796.           fc:=Char(ComPort^.ReadByte);
  797.           TextAttr:=GemAttr;
  798.  
  799.           IF (NOT In_Ansi) AND (NOT In_Avatar) AND (fc=#8) THEN
  800.           BEGIN
  801.             Write(#8);
  802.             IF Cfg.DumbTerm.DestructiveBS THEN Write(' '#8);
  803.           END ELSE
  804.           BEGIN
  805.             CASE TermMode OF
  806.               0 : IF In_Ansi OR NOT (In_Avatar OR (fc=^V) OR (fc=^Y)) THEN
  807.                   BEGIN
  808.                     IF fc=#12 THEN ClrScr ELSE AnsiWrite(fc);
  809.                   END ELSE
  810.                     AvatarWrite(fc);
  811.               1 : IF fc=#12 THEN ClrScr ELSE AnsiWrite(fc);
  812.               2 : AvatarWrite(fc);
  813.             END;
  814.           END;
  815.  
  816.           GemAttr:=TextAttr;
  817.           IF NOT (In_Avatar OR In_Ansi) THEN
  818.           BEGIN
  819.             IF LogMode THEN LogFile.Write(fc, 1);
  820.             MoveFast(DetectStr[2],DetectStr[1],19);
  821.             DetectStr[20]:=CHAR(fc);
  822.             IF Copy(DetectStr,15,6)='**'#24'B00' THEN
  823.             BEGIN
  824.               SetupTransferWindows(false);
  825.               ZModemReceive(cfg.Inbound[GlobNodeStat],False);
  826.               RemoveTransferWindows;
  827.               NewTimerSecs(InActivity, 300);
  828.               DetectStr:=CharStr(' ',20);
  829.             END;
  830.             j:=0;
  831.             FOR i:=1 TO 5 DO
  832.               WITH Cfg.ExtProt[i] DO
  833.               BEGIN
  834.                 IF (AutoStart<>'') AND (AutoStart=Copy(DetectStr,21-Length(AutoStart),20)) THEN
  835.                   Break;
  836.               END;
  837.             IF j<>0 THEN
  838.             BEGIN
  839.               ReceiveFiles(j+6);
  840.               NewTimerSecs(InActivity, 300);
  841.               DetectStr:=CharStr(' ',20);
  842.             END;
  843.           END;
  844.         END ELSE
  845.           IF WasOnline AND NOT ComPort^.Carrier THEN
  846.           BEGIN
  847.             HangUpModem;
  848.             DisplayStatusLine;
  849.             ClearAnsiState; ClearAvatarState;
  850.           END ELSE
  851.             IF (NOT WasOnLine) AND (ComPort^.Carrier) THEN
  852.             BEGIN
  853.               WasOnLine:=True;
  854.               DisplayStatusLine;
  855.             END;
  856.       UNTIL (InKey=AltX) OR TimerExpired(InActivity);
  857.     END;
  858.  
  859.     PROCEDURE FinishTerminal;
  860.     BEGIN
  861.       IF LogMode THEN LogFile.Done;
  862.       KillWindow(TerminalWin);
  863.       KillWindow(StatusWin);
  864. {     hiddencursor;}
  865.       ComPort^.SetLinkData(8,0,0);
  866.       ComPort^.SetFlowControl(0);
  867.       InitModemForEvent;
  868.       StartClock;
  869.       HelpKey:=F1;
  870.     END;
  871.  
  872.   BEGIN
  873.     FillChar(Call, SizeOf(Call), 0);
  874.     IF SetInterCom(ICDumbTerm,Call,False) THEN
  875.     BEGIN
  876.       InitTerminal;
  877.       TerminalMain;
  878.       FinishTerminal;
  879.     END;
  880.   END;
  881.  
  882. END.
  883.